﻿// Inner Fire 游戏引擎库
// AvatarAttach - 通用骨架附着设定。
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层(4)
// 管理武器和道具附着在骨骼上的东西。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-06-11

#include "avatar_attach.h"
#include <enum_parser.h>
#include <klog.h>

namespace ifire::game {

AvatarAttachPlan::AvatarAttachPlan(const ikit::XmlNode& node) : trans(node) {
  avatars = ikit::get_string_list(node("Avatars").value);
  actions = ikit::get_string_list(node("Actions").value);
}

AvatarAttach::AvatarAttach(const ikit::XmlNode& node)
    : id(node("ID"))
    , name(node("Name"))
    , bone(node("Bone"))
    , trans(node)
    , rotation(node("Rotation")) {

  // 载入武器附着项目
  node.ReadPtrs("Plan", plans_);
}

const Trans3& AvatarAttach::Pick(
    ikit::sstr avatar_name, ikit::sstr clip_name) const {
  for (auto& e : plans_) {
    for (auto& i : e->avatars) {
      if (i == avatar_name) {
        return e->trans;
      }
    }
    for (auto& i : e->actions) {
      if (i == clip_name) {
        return e->trans;
      }
    }
  }

  return trans;
}

AvatarAttachType ParseAvatarAttachType(ikit::sstr name) {
  // 特殊处理，如果没有name，则表示为None，如果有Name，但无法识别，表示为Extra
  if (name.empty()) {
    return AvatarAttachType::None;
  }

  static std::pair<ikit::sstr, AvatarAttachType> enums[] = {
      {"Weapon1", AvatarAttachType::Weapon1}, //
      {"Weapon2", AvatarAttachType::Weapon2}, //
      {"Shield", AvatarAttachType::Shield},   //
      {"Follow", AvatarAttachType::Follow},   //
      {"Extra", AvatarAttachType::Extra},     //
  };
  static ikit::EnumParser<AvatarAttachType> parser(
      enums, (int)AvatarAttachType::Extra + 1);
  return parser.Get(name, AvatarAttachType::Extra);
}

} // namespace ifire::game